Skip to content

✨ Add pass and patterns for measurement lifting#1705

Open
DRovara wants to merge 21 commits into
mainfrom
mlir/measurement-lifting
Open

✨ Add pass and patterns for measurement lifting#1705
DRovara wants to merge 21 commits into
mainfrom
mlir/measurement-lifting

Conversation

@DRovara

@DRovara DRovara commented May 13, 2026

Copy link
Copy Markdown
Collaborator

Description

Part 1 out of 3 of the Qubit Reuse Implementation

This PR ports the previous implementation of the Measurement Lifting pass to the new dialect infrastructure.
Measurements can be lifted over:

  • Arbitrary controls of controlled gates
  • Diagonal gates such as Z, Rx, etc.
  • Anti-diagonal gates, provided the measurement outcome is then inverted.

This is one of 3 PRs that will, in total, constitute qubit reuse:

  1. Measurement Lifitng
  2. Replacing Classical Controls
  3. Reuse Qubits

AI Notice: Gemini 3.1 and Claude Sonnet 4.6 were used for the generation of some code.

Checklist

  • The pull request only contains commits that are focused and relevant to this change.
  • I have added appropriate tests that cover the new/changed functionality.
  • I have updated the documentation to reflect these changes.
  • I have added entries to the changelog for any noteworthy additions, changes, fixes, or removals.
  • I have added migration instructions to the upgrade guide (if needed).
  • The changes follow the project's style guidelines and introduce no new warnings.
  • The changes are fully tested and pass the CI checks.
  • I have reviewed my own code changes.

If PR contains AI-assisted content:

  • I have disclosed the use of AI tools in the PR description as per our AI Usage Guidelines.
  • AI-assisted commits include an Assisted-by: [Model Name] via [Tool Name] footer.
  • I confirm that I have personally reviewed and understood all AI-generated content, and accept full responsibility for it.

@DRovara DRovara self-assigned this May 13, 2026
@DRovara DRovara added feature New feature or request c++ Anything related to C++ code MLIR Anything related to MLIR labels May 13, 2026
@DRovara DRovara added this to the MLIR Support milestone May 13, 2026
@codecov

codecov Bot commented May 13, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 98.78049% with 1 line in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
...CO/Transforms/Optimizations/MeasurementLifting.cpp 98.7% 1 Missing ⚠️

📢 Thoughts on this report? Let us know!

@DRovara

DRovara commented Jun 2, 2026

Copy link
Copy Markdown
Collaborator Author

@coderabbitai full review

@coderabbitai

coderabbitai Bot commented Jun 2, 2026

Copy link
Copy Markdown
Contributor
✅ Actions performed

Full review triggered.

@coderabbitai

coderabbitai Bot commented Jun 2, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

📝 Walkthrough

Walkthrough

QCO adds a MeasurementLifting pass that rewrites measurements across compatible gates, including boolean-result inversion for anti-diagonal gates. The builder adds boolean constants and updated finalization handling, with comprehensive unit coverage.

Changes

Measurement Lifting Optimization

Layer / File(s) Summary
Pass declaration
mlir/include/mlir/Dialect/QCO/Transforms/Passes.td
Declares and documents the measurement-lifting module pass.
Builder support
mlir/include/mlir/Dialect/QCO/Builder/QCOProgramBuilder.h, mlir/lib/Dialect/QCO/Builder/QCOProgramBuilder.cpp
Adds boolean i1 constants and routes default finalization through return-value handling.
Rewrite implementation
mlir/lib/Dialect/QCO/Transforms/Optimizations/MeasurementLifting.cpp
Adds diagonal, inverting, and controlled-gate measurement rewrites with greedy application.
Validation
mlir/unittests/Dialect/QCO/Transforms/Optimizations/*
Adds the test target and coverage for supported lifting cases and a negative multi-gate control case.

Estimated code review effort: 4 (Complex) | ~45 minutes

Sequence Diagram(s)

sequenceDiagram
  participant MeasurementLifting
  participant MeasureOp
  participant Gate
  participant Arith
  MeasurementLifting->>MeasureOp: match predecessor gate
  MeasureOp->>Gate: classify gate
  Gate->>MeasurementLifting: return applicable rewrite
  MeasurementLifting->>MeasureOp: move measurement before gate
  MeasurementLifting->>Arith: create boolean inversion for X/Y gates
Loading

Suggested labels: enhancement

Suggested reviewers: burgholzer, denialhaag, matthiasreumann

Poem

A bunny hops through gates of phase,
And lifts measurements through the maze.
True bits flip when X goes by,
Controlled paths rearrange the sky.
Tests bloom softly—hop, hooray!

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 20.75% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Title check ✅ Passed The title is concise and accurately summarizes the main change: adding measurement-lifting pass patterns.
Description check ✅ Passed The description covers the change summary, context, tests, docs, AI disclosure, and checklist, with only minor omissions like an explicit issue reference.
✨ Finishing Touches
✨ Simplify code
  • Create PR with simplified code
  • Commit simplified code in branch mlir/measurement-lifting

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 11

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
mlir/include/mlir/Dialect/QCO/IR/QCOOps.td (1)

99-139: ⚠️ Potential issue | 🟠 Major | 🏗️ Heavy lift

Don’t model recorded qco.measure as unconditionally Pure; it can be erased while still writing to classical registers.

MeasureOp is defined with [Pure], and canonicalization can drop it when its qubit result is only used by qco.sink (via checkAndRemoveDeadGate, which replaces the qubit output with the input and erases the op, explicitly ignoring the classical outcome). When any register_* attribute is present, the QCToQIR lowering allocates a result array and passes a result-pointer into __quantum__qis__mz__body, so the recorded measurement produces observable classical output even if the SSA i1 result is unused. Marking the op Pure therefore makes those register writes incorrectly erasable.

Remove Pure for recorded measurements (or otherwise make the operation report a write effect whenever register_name/register_size/register_index are present), while keeping it effect-free only for the non-recording case.

mlir/lib/Dialect/QCO/Builder/QCOProgramBuilder.cpp (1)

1108-1160: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Reject non-i64 exit codes in the new overload.

initialize() hard-codes main to return i64, but finalize(Value exitCode) accepts any Value. Passing an i1 here will build a func.return with the wrong type and leave invalid IR; the new measurement-lifting tests already have to call i1ToI64(...) before using this overload for exactly that reason (mlir/unittests/Dialect/QCO/Transforms/Optimizations/test_qco_measurement_lifting.cpp:272-294). Add an early type check and document the i64 requirement in the header.

Suggested guard
 OwningOpRef<ModuleOp> QCOProgramBuilder::finalize(Value exitCode) {
   checkFinalized();
+  if (exitCode.getType() != getI64Type()) {
+    llvm::reportFatalUsageError("Exit code must have type i64");
+  }
 
   // Ensure that main function exists and insertion point is valid
   auto* insertionBlock = getInsertionBlock();
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@mlir/lib/Dialect/QCO/Builder/QCOProgramBuilder.cpp` around lines 1108 - 1160,
The finalize(Value exitCode) overload accepts any Value but main() is hard-coded
to return i64, so add an early runtime/type check in QCOProgramBuilder::finalize
to reject non-i64 exitCode Values (e.g., verify exitCode.getType() is an
IntegerType of width 64 and call llvm::reportFatalUsageError or similar if not)
before creating func::ReturnOp; also update the QCOProgramBuilder::finalize
declaration comment in the header to document the required i64 exit code and
mirror the behavior of initialize() which sets main's return type to i64.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@CHANGELOG.md`:
- Line 14: In CHANGELOG.md fix the broken contributor reference by replacing the
incorrect label "[**DRovara**]" with the correct label "[**`@DRovara`**]" so it
matches the existing contributor reference definitions; update the line
containing "✨ Add Dead Gate Elimination Pattern ([`#1755`]) ([**DRovara**])" to
use "[**`@DRovara`**]" instead.

In `@mlir/include/mlir/Dialect/QCO/QCOUtils.h`:
- Around line 258-263: The MeasureOp removal currently replaces uses with
m.getQubitIn() and erases the op unconditionally; update the branch handling
MeasureOp so it first checks the measurement's classical-recording fields (e.g.,
register_name, register_size, register_index) and only perform
rewriter.replaceAllUsesWith(m.getQubitOut(), m.getQubitIn()) followed by
rewriter.eraseOp(op) when those fields indicate the measurement is not recorded
(empty/default). If any of register_name/register_size/register_index show the
measurement is recorded, skip the erase (return failure/skip) to preserve the
classical output.

In `@mlir/include/mlir/Dialect/QCO/Transforms/Passes.td`:
- Around line 181-183: Fix the typos in the MLIR pass summary string: update the
TD variable 'summary' (let summary = ...) to replace "shiftling" with "shifting"
and ensure there's a space between "as" and "possible" so the concatenated
strings read "as far up as possible, shifting them above...". Edit the two
adjacent string literals so they join correctly and contain the corrected word.
- Around line 184-188: The description string assigned to let description in
mlir/include/mlir/Dialect/QCO/Transforms/Passes.td contains a copy-paste error
("lifts measurements gates away from the measurements") likely from
HadamardLifting; update the description to accurately describe this pass's
behavior (measurement lifting as part of qubit reuse: moving/earlier placement
of measurement operations to enable qubit reuse and gate removal), editing the
let description block for the relevant pass (compare with the HadamardLifting
description to avoid repeating its phrasing) so the text clearly states that
measurement lifting moves measurements earlier to free qubits for reuse and
optimize/remove subsequent quantum gates.

In `@mlir/lib/Dialect/QCO/Builder/QCOProgramBuilder.cpp`:
- Around line 1103-1105: The no-arg QCOProgramBuilder::finalize() currently
calls intConstant(0) before running the validation that finalize(Value)
performs, which can create ops or mutate the wrong block if the builder wasn't
initialized or the insertion point isn't main's entry; change
QCOProgramBuilder::finalize() to first validate that 'main' exists and that the
current insertion point is inside main's entry block (reusing the same checks
used by finalize(Value)), and only after those checks succeed call
intConstant(0) and forward to finalize(Value); reference the methods
QCOProgramBuilder::finalize(), QCOProgramBuilder::finalize(Value), and the
helper intConstant to locate where to reorder the work.

In `@mlir/lib/Dialect/QCO/Transforms/Optimizations/MeasurementLifting.cpp`:
- Line 44: The free helper functions are currently relying on
anonymous-namespace linkage but should be declared with static linkage per
project convention; change the declarations of the free functions isInverting,
isDiagonal, and swapGateWithMeasurement to be marked static (e.g., static bool
isInverting(...), static bool isDiagonal(...), static Operation*
swapGateWithMeasurement(...)) so they use internal linkage instead of an
anonymous namespace, leaving their bodies and call sites unchanged.
- Line 29: The file includes the unused header <numbers> which should be
removed; edit MeasurementLifting.cpp to delete the line '`#include` <numbers>'
(ensure no other uses of std::numbers remain in functions such as any helpers or
transformations in MeasurementLifting-related functions) so the build has no
superfluous include.
- Line 51: The isDiagonal predicate currently checks for ZOp, SOp, TOp, POp,
RZOp but omits diagonal gate types used in tests; update the isDiagonal function
to also recognize SdgOp, TdgOp, and IdOp so measurements can be lifted over id,
sdg, and tdg gates (i.e., include SdgOp, TdgOp, IdOp alongside the existing
isa<ZOp, SOp, TOp, POp, RZOp> check in the isDiagonal helper).

In `@mlir/unittests/Dialect/QCO/IR/test_qco_ir.cpp`:
- Around line 117-223: Add a new unit test (e.g., in QCOTest alongside
CheckIfOpDeadGateElimination) that creates a measurement with a
recorded/classical name (call builder.measure with the recorded-name overload
like measure("c", 1, 0) or the API that records the result), uses those qubit
outputs and sinks them (so both qubits are later sunk), and constructs a
reference module where the measurement is preserved; then run
verify/runQCOCleanupPipeline on both and assert
areModulesEquivalentWithPermutations(module, refModule). This ensures the
cleanup pass does not eliminate measurements whose classical result is
externally recorded; reference the existing QCOProgramBuilder usage,
builder.measure, builder.qcoIf, and areModulesEquivalentWithPermutations to
locate where to add the test.

In
`@mlir/unittests/Dialect/QCO/Transforms/Optimizations/test_qco_measurement_lifting.cpp`:
- Around line 318-342: The isDiagonal predicate in MeasurementLifting.cpp
currently checks only ZOp, SOp, TOp, POp, RZOp, so id, sdg and tdg gates are not
treated as diagonal; update the isDiagonal implementation to also return true
for the identity, sdg and tdg ops (e.g., IdOp, SdgOp, TdgOp or whatever the MLIR
op class names are in your codebase) so MeasurementLifting::lift (and related
code using isDiagonal) will permit lifting measurements over id, sdg and tdg
gates.
- Around line 296-316: The reference test liftMeasurementOverSingleY creates
xorOp but never uses its result, so canonicalization can drop the dead XOR;
update the referenceBuilder finalization to include xorOp's result (e.g.,
convert the xor i1 to i64 like i1ToI64 or otherwise pass it into
referenceBuilder.finalize()) so the XOR is live, and likewise ensure the
programBuilder path passes its measurement result to finalize() so the test
actually verifies the inversion inserted by runMeasurementLiftingPass; modify
usages around xorOp, referenceBuilder.finalize(), and programBuilder.finalize()
accordingly.

---

Outside diff comments:
In `@mlir/lib/Dialect/QCO/Builder/QCOProgramBuilder.cpp`:
- Around line 1108-1160: The finalize(Value exitCode) overload accepts any Value
but main() is hard-coded to return i64, so add an early runtime/type check in
QCOProgramBuilder::finalize to reject non-i64 exitCode Values (e.g., verify
exitCode.getType() is an IntegerType of width 64 and call
llvm::reportFatalUsageError or similar if not) before creating func::ReturnOp;
also update the QCOProgramBuilder::finalize declaration comment in the header to
document the required i64 exit code and mirror the behavior of initialize()
which sets main's return type to i64.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 285fd211-de81-448a-8fe6-648bb7642bb9

📥 Commits

Reviewing files that changed from the base of the PR and between e868fe9 and 0edfeb1.

📒 Files selected for processing (15)
  • CHANGELOG.md
  • mlir/include/mlir/Dialect/QCO/Builder/QCOProgramBuilder.h
  • mlir/include/mlir/Dialect/QCO/IR/QCODialect.td
  • mlir/include/mlir/Dialect/QCO/IR/QCOOps.td
  • mlir/include/mlir/Dialect/QCO/QCOUtils.h
  • mlir/include/mlir/Dialect/QCO/Transforms/Passes.td
  • mlir/lib/Dialect/QCO/Builder/QCOProgramBuilder.cpp
  • mlir/lib/Dialect/QCO/IR/Operations/MeasureOp.cpp
  • mlir/lib/Dialect/QCO/IR/Operations/ResetOp.cpp
  • mlir/lib/Dialect/QCO/IR/QCOOps.cpp
  • mlir/lib/Dialect/QCO/IR/SCF/IfOp.cpp
  • mlir/lib/Dialect/QCO/Transforms/Optimizations/MeasurementLifting.cpp
  • mlir/unittests/Dialect/QCO/IR/test_qco_ir.cpp
  • mlir/unittests/Dialect/QCO/Transforms/Optimizations/CMakeLists.txt
  • mlir/unittests/Dialect/QCO/Transforms/Optimizations/test_qco_measurement_lifting.cpp

Comment thread CHANGELOG.md Outdated
Comment thread mlir/include/mlir/Dialect/QCO/QCOUtils.h Outdated
Comment thread mlir/include/mlir/Dialect/QCO/Transforms/Passes.td Outdated
Comment thread mlir/include/mlir/Dialect/QCO/Transforms/Passes.td
Comment thread mlir/lib/Dialect/QCO/Builder/QCOProgramBuilder.cpp Outdated
Comment thread mlir/lib/Dialect/QCO/Transforms/Optimizations/MeasurementLifting.cpp Outdated
Comment thread mlir/lib/Dialect/QCO/Transforms/Optimizations/MeasurementLifting.cpp Outdated
Comment thread mlir/unittests/Dialect/QCO/IR/test_qco_ir.cpp Outdated
@DRovara DRovara force-pushed the mlir/measurement-lifting branch from 71c196d to 5510fe8 Compare July 14, 2026 01:17
@DRovara

DRovara commented Jul 14, 2026

Copy link
Copy Markdown
Collaborator Author

@coderabbitai full review

@coderabbitai

coderabbitai Bot commented Jul 14, 2026

Copy link
Copy Markdown
Contributor
✅ Action performed

Full review finished.

@DRovara DRovara marked this pull request as ready for review July 14, 2026 03:40

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
mlir/lib/Dialect/QCO/Builder/QCOProgramBuilder.cpp (1)

1164-1168: ⚠️ Potential issue | 🟠 Major

Validate finalization state before creating the exit-code constant.

finalize() still calls intConstant(0) before finalize(ValueRange) validates that main exists and the insertion point is in its entry block. An uninitialized builder or invalid insertion point can therefore create an operation in the wrong location—or fail inside constant creation—before reporting the intended usage error. Perform the same validation before constructing exitCode.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@mlir/lib/Dialect/QCO/Builder/QCOProgramBuilder.cpp` around lines 1164 - 1168,
Update QCOProgramBuilder::finalize() to perform the same main-existence and
entry-block insertion-point validation used by finalize(ValueRange) before
calling intConstant(0); preserve the existing checkFinalized() behavior and then
delegate with the created exitCode.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@mlir/include/mlir/Dialect/QCO/Transforms/Passes.td`:
- Around line 211-236: Update the measurement lifting description in the pass
definition to document that the X/measurement commutation rule also applies to Y
gates, matching the behavior of isInverting in MeasurementLifting.cpp. Extend
the existing rule’s explanation without changing the implementation or other
documented commutation rules.

In `@mlir/lib/Dialect/QCO/Transforms/Optimizations/MeasurementLifting.cpp`:
- Around line 126-129: The doc comment for the measurement-lifting pattern
overstates its scope; revise it to state that the pattern lifts measurements
above inverting (anti-diagonal) gates, specifically X and Y, rather than all
non-phase gates.
- Around line 203-207: Update the MeasurementLifting struct’s Doxygen comment to
remove the duplicated “gates” word, leaving the description as raising
Measurements above controlled and uncontrolled gates.

In
`@mlir/unittests/Dialect/QCO/Transforms/Optimizations/test_qco_measurement_lifting.cpp`:
- Around line 419-454: Update the reference circuit in
liftMeasurementOverXAndControlledGates to use referenceBuilder.cy for both
controlled-gate constructions instead of referenceBuilder.cx, preserving the
controlled-Y operations from the program circuit before the equivalence check.

---

Outside diff comments:
In `@mlir/lib/Dialect/QCO/Builder/QCOProgramBuilder.cpp`:
- Around line 1164-1168: Update QCOProgramBuilder::finalize() to perform the
same main-existence and entry-block insertion-point validation used by
finalize(ValueRange) before calling intConstant(0); preserve the existing
checkFinalized() behavior and then delegate with the created exitCode.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: feb15e66-efcc-4e2d-b9ba-0e8e0e91f747

📥 Commits

Reviewing files that changed from the base of the PR and between e78c99a and 1611c1b.

📒 Files selected for processing (6)
  • mlir/include/mlir/Dialect/QCO/Builder/QCOProgramBuilder.h
  • mlir/include/mlir/Dialect/QCO/Transforms/Passes.td
  • mlir/lib/Dialect/QCO/Builder/QCOProgramBuilder.cpp
  • mlir/lib/Dialect/QCO/Transforms/Optimizations/MeasurementLifting.cpp
  • mlir/unittests/Dialect/QCO/Transforms/Optimizations/CMakeLists.txt
  • mlir/unittests/Dialect/QCO/Transforms/Optimizations/test_qco_measurement_lifting.cpp

Comment thread mlir/include/mlir/Dialect/QCO/Transforms/Passes.td
@DRovara

DRovara commented Jul 14, 2026

Copy link
Copy Markdown
Collaborator Author

@coderabbitai fully review

@coderabbitai

coderabbitai Bot commented Jul 14, 2026

Copy link
Copy Markdown
Contributor

@DRovara, triggering a full review of the PR now.

✅ Action performed

Full review finished.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@mlir/include/mlir/Dialect/QCO/Transforms/Passes.td`:
- Around line 205-207: Format the dependentDialects list in the pass definition
by removing the trailing comma after ArithDialect and placing the closing
bracket consistently with the other pass declarations in Passes.td.

In
`@mlir/unittests/Dialect/QCO/Transforms/Optimizations/test_qco_measurement_lifting.cpp`:
- Around line 11-13: Remove the IDE-generated “Created by” comment from the file
header, leaving the surrounding comment structure or file contents unchanged.
- Around line 145-155: Remove the const qualifier from all ValueRange lambda
parameters in the measurement-lifting test, including the callbacks around the
shown programBuilder.ctrl calls and their mirrored reference-builder
occurrences. Keep the lambda captures and callback behavior unchanged, following
the existing non-const Value parameter convention.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 34784eb8-0bb8-4fe6-bb6b-62ba4e7f7e01

📥 Commits

Reviewing files that changed from the base of the PR and between e78c99a and 096075c.

📒 Files selected for processing (6)
  • mlir/include/mlir/Dialect/QCO/Builder/QCOProgramBuilder.h
  • mlir/include/mlir/Dialect/QCO/Transforms/Passes.td
  • mlir/lib/Dialect/QCO/Builder/QCOProgramBuilder.cpp
  • mlir/lib/Dialect/QCO/Transforms/Optimizations/MeasurementLifting.cpp
  • mlir/unittests/Dialect/QCO/Transforms/Optimizations/CMakeLists.txt
  • mlir/unittests/Dialect/QCO/Transforms/Optimizations/test_qco_measurement_lifting.cpp

Comment thread mlir/include/mlir/Dialect/QCO/Transforms/Passes.td Outdated
@DRovara DRovara requested a review from burgholzer July 14, 2026 04:19
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

c++ Anything related to C++ code feature New feature or request MLIR Anything related to MLIR

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant